Chcete tento příspěvek vylepšit? Uveďte podrobné odpovědi na tuto otázku, včetně citací a vysvětlení, proč je vaše odpověď správná. Odpovědi bez dostatečných podrobností lze upravovat nebo mazat. Chybně jsem přidal soubory do Gitu pomocí příkazu: git přidejte myfile.txt Ještě jsem nespustil git commit. Existuje způsob, jak to vrátit zpět, takže tyto soubory nebudou zahrnuty do potvrzení?
2020-12-07 21:19:19
1 2 další Před odevzdáním s můžete vrátit git add git resetkterý jej odstraní z aktuálního indexu (seznamu „chystá se potvrzení“) beze změny čehokoli jiného. Můžeš použít git reset bez jakéhokoli názvu souboru, aby byly všechny náležité změny zrušeny. To se může hodit, když je v rozumném čase příliš mnoho souborů na to, aby mohly být uvedeny jeden po druhém. Ve starých verzích Gitu jsou výše uvedené příkazy ekvivalentní git reset HEAD a git reset HEAD, respektive, a selžou, pokud HEAD není definován (protože jste ve svém úložišti ještě neudělali žádné závazky) nebo nejednoznačný (protože vytvořil větev s názvem HEAD, což je hloupá věc, kterou byste neměli dělat). To se však v Gitu 1.8.2 změnilo, takže v moderních verzích Gitu můžete výše uvedené příkazy použít ještě před provedením prvního potvrzení: "git reset" (bez možností nebo parametrů) slouží k chybě, když ve své historii nemáte žádné závazky, ale nyní vám to dává prázdný index (aby odpovídal neexistujícímu potvrzení, že nejste ani na). Dokumentace: git reset | Ty chceš: git rm --cached Uvažování: Když jsem v tom byl nový, zkusil jsem to poprvé git reset. (pro zrušení celého mého počátečního přidání), jen pro získání této (ne tak) užitečné zprávy: fatální: Nepodařilo se vyřešit 'HEAD' jako platný ref. Ukazuje se, že je to proto, že HEAD ref (větev?) Neexistuje až po prvním potvrzení. To znamená, že narazíte na stejný problém pro začátečníky jako já, pokud váš pracovní postup, jako ten můj, byl něco jako: cd do mého skvělého nového adresáře projektu a vyzkoušet Git, novou žhavost git init git přidat. stav git ... spousta svinských svitků od ... => Sakra, nechtěl jsem to všechno přidat. google „undo git add“ => najít přetečení zásobníku - yay git reset. => fatální: Nepodařilo se vyřešit 'HEAD' jako platný odkaz. Dále se ukazuje, že v seznamu adresátů je zaznamenána chyba proti neužitečnosti této chyby. A že správné řešení bylo právě tam ve výstupu stavu Git (který, ano, přešel jsem jako kecy) ... # Provedené změny: # (použijte "git rm --cached ..." pro odložení) ... Řešením je skutečně použít SOUBOR git rm --cached. Všimněte si varování jinde zde - git rm odstraní místní pracovní kopii souboru, ale ne pokud použijete --cached. Tady je výsledek git help rm: - uloženo do mezipaměti Tuto možnost použijte k odinstalaci a odebrání cest pouze z indexu. Soubory pracovního stromu, ať už upravené nebo ne, budou ponechány. Pokračuji v používání git rm - cache. odstranit vše a začít znovu. Nefungovalo to, protože zatímco přidávám. je rekurzivní, ukázalo se, že rm potřebuje -r k opakování. Povzdech. git rm -r - uloženo do mezipaměti. Dobře, teď jsem zpátky tam, kde jsem začal. Příště použiji -n k běhu nasucho a uvidím, co bude přidáno: git přidat -n. Vše jsem zazipoval na bezpečné místo, než jsem důvěřoval git help rm o tom, že --cached nic nezničil (a co když jsem to špatně napsal). | Pokud zadáte: stav git Git vám řekne, co je představeno atd., Včetně pokynů, jak postupovat: použijte "git reset HEAD ..." pro odinstalaci Zjistil jsem, že Git dělá docela dobrou práci, když mě nutí dělat správnou věc v takových situacích. Poznámka: Poslední verze Git (1.8.4.x) tuto zprávu změnily: (použijte "git rm --cached ..." pro odložení) | Upřesnění: git add přesune změny z aktuálního pracovního adresáře do pracovní oblasti (index). Tento proces se nazývá pracovní. Nejpřirozenější příkaz k provedení změn (změněných souborů) je tedy zřejmý: git fáze git add je jen jednodušší alias pro git stage Škoda, že neexistují žádné příkazy git unstage ani git unadd. Relevantní je těžší uhodnout nebo zapamatovat, ale je docela zřejmé: git reset HLAVA - K tomu můžeme snadno vytvořit alias: git config --global alias.unadd 'reset HEAD -' git config --global alias.unstage 'reset HEAD -' A konečně máme nové příkazy: git přidat soubor1 git fáze file2 git nepřidejte soubor2 git unstage file1 Osobně používám ještě kratší aliasy: git a # Pro staging git u # Pro unstaging | Kromě přijaté odpovědi, pokud byl váš omylem přidaný soubor obrovský, pravděpodobně si všimnete, že i po jeho odstranění z indexu pomocí 'git reset' se zdá, že stále zabírá místo v adresáři .git. Toho se nemusíte bát; soubor je skutečně stále v úložišti, ale pouze jako „volný objekt“. Nebude zkopírován do jiných úložišť (pomocí klonu, push) a prostor bude nakonec uvolněn - i když možná ne příliš brzy. Pokud máte úzkost, můžete spustit: git gc --prune = nyní Aktualizace (následuje můj pokus o odstranění nejasností, které mohou vzniknout z nejvíce hlasovaných odpovědí): Jaké je tedy skutečné vrácení git add? git reset HEAD ? nebo git rm --cached ? Přísně vzato, a pokud se nemýlím: žádný. git add nelze vrátit zpět - obecně bezpečně. Nejprve si připomeňme, co vlastně dělá git add : Pokud soubor nebyl dříve sledován, přidá jej git addmezipaměť s aktuálním obsahem. Pokud byl soubor již sledován, git add uloží aktuální obsah (snímek, verzi) do mezipaměti. V Gitu se tato akce stále nazývá add (ne pouze její aktualizace), protože dvě různé verze (snímky) souboru jsou považovány za dvě různé položky: proto do mezipaměti skutečně přidáváme novou položku, která má být nakonec spáchal později. S ohledem na to je otázka mírně nejednoznačná: Omylem jsem přidal soubory pomocí příkazu ... Scénář OP se zdá být první (nesledovaný soubor), chceme, aby „vrácení“ odstranilo soubor (nejen aktuální obsah) ze sledovaných položek. Pokud je to váš případ, pak je v pořádku spustit git rm --cached . A mohli bychom také spustit git reset HEAD . To je obecně výhodnější, protože to funguje v obou scénářích: provede také vrácení zpět, když jsme nesprávně přidali verzi již sledované položky. Existují však dvě výhrady. Za prvé: Existuje (jak je uvedeno v odpovědi) pouze jeden scénář, ve kterém git reset HEAD nefunguje, ale git rm --cached ano: nové úložiště (bez závazků). Ale ve skutečnosti jde o prakticky irelevantní případ. Za druhé: Uvědomte si, že git reset HEAD nemůže magicky obnovit obsah dříve uloženého souboru v mezipaměti, pouze jej znovu synchronizuje z HEAD. Pokud náš zavádějící git add přepsal předchozí inscenovanou nezávaznou verzi, nemůžeme ji obnovit. Proto, přísně vzato, nemůžeme vrátit zpět [*]. Příklad: $ git init $ echo "verze 1"> file.txt $ git přidat soubor.txt # První přidání souboru.txt $ git commit -m 'první potvrzení' $ echo "verze 2"> file.txt $ git přidat file.txt # Fáze (nezávazně) „verze 2“ file.txt $ git diff - uložený soubor.txt -verze 1 + verze 2 $ echo "verze 3"> file.txt $ git diff soubor.txt -verze 2 + verze 3 $ git add file.txt # Jejda, nemysleli jsme to vážně $ git reset HEAD file.txt # Zpět? $ git diff --cached file.txt # Samozřejmě žádný rozdíl. fáze == HLAVA $ git diff file.txt # Nezvratně jsme ztratili „verzi 2“ -verze 1 + verze 3 Samozřejmě to není příliš důležité, pokud sledujeme obvyklý líný pracovní postup provádění 'git add' pouze pro přidávání nových souborů (případ 1) a aktualizujeme nový obsah pomocí příkazu commit, git commit -a. * (Upravit: výše je prakticky správné, ale stále existují určité mírně hackerské / spletité způsoby, jak obnovit změny, které byly provedeny, ale nebyly potvrzeny a poté přepsány - viz komentáře Johannes Matokic a iolsmit) | Vrátit soubor, který již byl přidán, je pomocí Gitu docela snadné. Pro resetování souboru myfile.txt, který již byl přidán, použijte: git reset HEAD myfile.txt Vysvětlení: Poté, co jste vytvořili nechtěné soubory, můžete akci vrátit zpět a provést git reset. Head je hlava vašeho souboru v místním a posledním parametrem je název vašeho souboru. Kroky na obrázku níže jsem pro vás vytvořil podrobněji, včetně všech kroků, které se mohou v těchto případech stát: | git rm - cache. -r "rekurzivně" zruší přidání "všeho, co jste přidali z aktuálního adresáře | Běh git gui a odstranit všechny soubory ručně nebo výběrem všech z nich a kliknutím na tlačítko Unstage from commit. | Otázka není jasně položena. Důvod je ten, že git add má dva významy: přidáním nového souboru do pracovní oblasti, poté vrátit zpět pomocí souboru git rm --cached. přidáním upraveného souboru do pracovní oblasti a poté zpět pomocí souboru git reset HEAD. V případě pochybností použijte git reset HEAD soubor Protože v obou případech plní očekávanou věc. Varování: pokud uděláte soubor git rm --cached v souboru, který byl upraven (soubor, který dříve existoval v úložišti), bude soubor odstraněn při git commit! Ve vašem souborovém systému bude stále existovat, ale pokud vaše potvrzení potvrdí kdokoli jiný, soubor bude odstraněn z jeho pracovního stromu. git status vám řekne, zda byl soubor nový soubor nebo změněn: Na pobočce master Provedené změny: (pro odinstalaci použijte „git reset HEAD ...“) nový soubor: my_new_file.txt změněno: my_modified_file.txt | Git má příkazy pro každou představitelnou akci, ale potřebuje správné znalosti, aby věci byly správné, a proto je přinejlepším kontraproduktivní ... Co jste dělali dříve: Změnil soubor a použil git add. Nebo git add . Co chceš: Odeberte soubor z indexu, ale ponechejte jej ve verzi a ponechejte v pracovní kopii nepotvrzené změny: git reset HEAD Obnovte soubor do posledního stavu z HEAD, zrušte změny a odstraňte je z indexu: # Mysli na `svn revert ` IIRC. git reset HEAD git checkout # Pokud máte ` ` s názvem jako , použijte: pokladna git - To je nutné, protože git reset --hard HEAD nebude fungovat s jednotlivými soubory. Odebrat soubor z indexu a verzí, zachovat soubor bez verze se změnami v pracovní kopii: git rm --cached Odeberte soubor z pracovní kopie a správy verzí úplně: git rm | Pokud jste na svém počátečním potvrzení a nemůžete použít gitreset, stačí prohlásit „Git bankrot“ a smazat složku .git a začít znovu | Podle mnoha dalších odpovědí můžete použít git reset ALE: Našel jsem tento skvělý malý příspěvek, který ve skutečnosti přidává příkaz Git (dobře, alias) pro git unadd: podrobnosti viz git unadd nebo .. Jednoduše, git config --global alias.unadd "resetovat HLAVU" Teď můžeš git nepřidejte foo.txt bar.txt | Pomocí git add -i odeberte právě přidané soubory z nadcházejícího potvrzení. Příklad: Přidání souboru, který jste nechtěli: $ git přidat foo stav $ git # Na pobočce # Provedené změny: # (pro odinstalaci použijte „git reset HEAD ...“) # # nový soubor: foo # # Nesledované soubory: # (použijte "git add ..." k zahrnutí do toho, co bude potvrzeno) # [...] # Přechod do interaktivního přidání zruší přidání (příkazy zadané na git zde jsou „r“ (vrátit se), „1“ (zobrazí se první položka v seznamu, která se vrátí zpět), „návrat“ pro odchod z režimu návratu a „q“ (přestat): $ git add -i inscenovaná nestavěná cesta 1: + 1 / -0 nic *** Příkazy *** 1: [s] tatus 2: [u] pdate 3: [r] evert 4: [a] dd netracked 5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp Co teď> r inscenovaná nestavěná cesta 1: + 1 / -0 nic [f] oo Vrátit zpět >> 1 inscenovaná nestavěná cesta * 1: + 1 / -0 nic [f] oo Vrátit >> poznámka: foo nyní není sledováno. obrátil jednu cestu *** Příkazy *** 1: [s] tatus 2: [u] pdate 3: [r] evert 4: [a] dd netracked 5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp Co teď> q Sbohem. $ A je to! Zde je váš důkaz, který ukazuje, že „foo“ je zpět na nesledovaném seznamu: stav $ git # Na pobočce # Nesledované soubory: # (použijte "git add ..." k zahrnutí do toho, co bude potvrzeno) # [...] # foo není přidáno nic k potvrzení, ale jsou přítomny nesledované soubory (ke sledování použijte „git add“) $ | K tomu lze použít git remove nebo git rm s příznakem --cached. Snaž se: git help rm | Tady je způsob, jak se vyhnout tomuto nepříjemnému problému při zahájení nového projektu: Vytvořte hlavní adresář pro svůj nový projekt. Spusťte git init. Nyní vytvořte soubor .gitignore (i když je prázdný). Potvrďte svůj soubor .gitignore. Git dělá git reset opravdu těžkým, pokud nemáte žádné závazky. Pokud vytvoříte malý počáteční závazek jen kvůli tomu, abyste jej mohli mít, můžete git add -A a git reset tolikrát, kolikrát chcete, aby bylo vše v pořádku. Další výhodou této metody je, že pokud narazíte na potíže s ukončováním řádků později a potřebujete obnovit všechny své soubory, je to snadné: Podívejte se na to počáteční potvrzení. Tím odstraníte všechny vaše soubory. Poté znovu zkontrolujte poslední potvrzení. Tím se načtou čerstvé kopie vašich souborů pomocí vašeho aktuálního nastavení konce řádku. | Možná se Git vyvinul od chvíle, kdy jste zveřejnili svůj dotaz. $> git --verze git verze 1.6.2.1 Nyní můžete vyzkoušet: git reset HEAD. To by mělo být to, co hledáte. | Pokud neurčíte revizi, musíte zahrnout oddělovač. Příklad z mé konzoly: git reset fatální: nejednoznačný argument ' ': neznámá revize nebo cesta není v pracovním stromu. Pomocí '-' oddělte cesty od revizí git reset - Nestálé změny po resetu: M (Git verze 1.7.5.4) | Odebrání nových souborů z pracovní oblasti (a pouze v případě nového souboru), jak je navrženo výše: git rm - uložený SOUBOR Použít rm --cached pouze pro nové náhodně přidané soubory. | Chcete-li obnovit každý soubor v konkrétní složce (a jejích podsložkách), můžete použít následující příkaz: git reset * | Příkaz * použijte ke zpracování více souborů najednou: git reset HEAD * .prj git reset HEAD * .bmp git reset HEAD * gdb * atd. | Jednoduše zadejte git reset, vrátí se zpět a je to, jako byste nikdy nezadali git add. od vašeho posledního spáchání. Ujistěte se, že jste se dopustili dříve. | Předpokládám, že vytvořím nový soubor newFile.txt: Předpokládejme, že soubor přidám náhodně, git přidám newFile.txt: Nyní chci toto přidání vrátit zpět, před spácháním git reset newFile.txt: | Pro konkrétní soubor: git reset my_file.txt git checkout my_file.txt Pro všechny přidané soubory: git reset. pokladna git. Poznámka: pokladna změní kód v souborech a přesune se do posledního aktualizovaného (potvrzeného) stavu. reset nemění kódy; pouze resetuje záhlaví. | Chcete-li vrátit git add, použijte: git resetuje název souboru | Tento příkaz zruší uložení vašich změn: git reset HEAD název_souboru.txt Můžete také použít git přidat -p přidat části souborů. | K dispozici je také interaktivní režim: git add -i Chcete-li přidat soubory, vyberte možnost 3. V mém případě často chci přidat více než jeden soubor a v interaktivním režimu můžete k přidávání souborů použít tato čísla. Bude to trvat kromě 4: 1, 2, 3 a 5 Chcete-li vybrat sekvenci, stačí zadat 1-5, aby se všechny od 1 do 5. Git pracovní soubory | git add myfile.txt # Tím se váš soubor přidá do seznamu závazků Naproti tomuto příkazu je, git reset HEAD myfile.txt # To se vrátíto. takže budete v předchozím stavu. Zadané bude opět v nesledovaném seznamu (předchozí stav). Obnoví vaši hlavu s uvedeným souborem. takže pokud to vaše hlava nemá, znamená to, že to jednoduše resetuje. | git reset souboru.txt Odebere soubor s názvem filename.txt z aktuálního indexu, v oblasti „chystá se potvrzení“, beze změny čehokoli jiného. | git reset souboru.txt Odebere soubor s názvem filename.txt z aktuálního indexu, v oblasti „chystá se potvrzení“, beze změny čehokoli jiného. | V Sourcetree to můžete udělat snadno pomocí grafického uživatelského rozhraní. Můžete zkontrolovat, který příkaz používá Sourcetree k unstage souboru. Vytvořil jsem nový soubor a přidal ho do Gitu. Pak jsem to připravil pomocí grafického uživatelského rozhraní Sourcetree. Toto je výsledek: Nestavení souborů [08/12/15 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c pověření.helper = sourcetree reset -q - cesta / k / souboru / názvu souboru.java Sourcetree používá reset k odchylování nových souborů. | 1 2 další Vysoce aktivní otázka. Získejte 10 reputace, abyste mohli odpovědět na tuto otázku. Požadavek na reputaci pomáhá chránit tuto otázku před spamem a neodpovědností. Toto není odpověď, kterou hledáte? Přečtěte si další otázky týkající se značek git version-control git-commit git-stage nebo položte vlastní otázku.